import { OpenCageGeocoderService } from '../../Source/Cesium.js';
import { Resource } from '../../Source/Cesium.js';
import { when } from '../../Source/Cesium.js';

describe('Core/OpenCageGeocoderService', function() {

    var endpoint = 'https://api.opencagedata.com/geocode/v1/';
    var apiKey = 'c2a490d593b14612aefa6ec2e6b77c47';

    it('constructor throws without url', function() {
        expect(function() {
            return new OpenCageGeocoderService(undefined);
        }).toThrowDeveloperError();
    });

    it('constructor throws without API Key', function() {
        expect(function() {
            return new OpenCageGeocoderService(endpoint, undefined);
        }).toThrowDeveloperError();
    });

    it('returns geocoder results', function () {
        var service = new OpenCageGeocoderService(endpoint, apiKey);

        var query = '-22.6792,+14.5272';
        var data = {
            results: [{
                bounds: {
                  northeast: {
                    lat: -22.6790826,
                    lng: 14.5269016
                  },
                  southwest: {
                    lat: -22.6792826,
                    lng: 14.5267016
                  }
                },
                formatted: 'Beryl\'s Restaurant, Woermann St, Swakopmund, Namibia',
                geometry: {
                  lat: -22.6795394,
                  lng: 14.5276006
                }
            }]
        };
        spyOn(Resource.prototype, 'fetchJson').and.returnValue(when.resolve(data));

        return service.geocode(query)
            .then(function(results) {
                expect(results.length).toEqual(1);
                expect(results[0].displayName).toEqual(data.results[0].formatted);
                expect(results[0].destination).toBeDefined();
            });
    });

    it('returns no geocoder results if OpenCage has no results', function() {
        var service = new OpenCageGeocoderService(endpoint, apiKey);

        var query = '';
        var data = { results: [] };
        spyOn(Resource.prototype, 'fetchJson').and.returnValue(when.resolve(data));

        return service.geocode(query)
            .then(function(results) {
                expect(results.length).toEqual(0);
            });
    });
});
